package com.ushine.web.base.model.system;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ushine.web.base.model.base.BaseBO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.Length;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * @Author: yls
 * @Date 2022/2/9 14:13
 * @Description: 数据权限表
 * @Version 1.0
 **/
@EqualsAndHashCode(callSuper = true)
@Entity
@Data
@ApiModel(description = "数据权限表")
@Table(name = "t_system_data_permission")
@org.hibernate.annotations.Table(appliesTo = "t_system_data_permission", comment = "数据权限表")
@TableName(value = "t_system_data_permission")
public class DataPermissionDO extends BaseBO implements Serializable {

    /**
     * 编号
     * // 解决前台js接收雪花id精度丢失问题
     * JsonFormat(shape = JsonFormat.Shape.STRING)
     */
    @Id
    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty("编号")
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    @Column(name = "id", columnDefinition = "bigint comment '编号'")
    private Long id;

    /**
     * 功能权限id：对应 PermissionDO 的id
     */
    @ApiModelProperty("功能权限id")
    @Column(name = "function_permission_id", columnDefinition = "bigint comment '功能权限id，对应 PermissionDO 的id'")
    private Long functionPermissionId;

    /**
     * 数据权限名称
     */
    @ApiModelProperty("数据权限名称")
    @Column(name = "data_permission_name", columnDefinition = "varchar(32) comment '数据权限名称'")
    @NotBlank(message = "数据权限名称不能为空")
    private String dataPermissionName;


    /**
     * 数据权限对应的mapper方法全路径
     */
    @ApiModelProperty("数据权限对应的mapper方法全路径")
    @Column(name = "data_mapper_function", columnDefinition = "varchar(255) comment '数据权限对应的mapper方法全路径'")
    @NotBlank(message = "数据权限对应的mapper方法全路径不能为空")
    @Length(max = 255, message = "数据权限对应的mapper方法全路径长度最长为：255")
    private String dataMapperFunction;

    /**
     * 数据权限对应的功能名称，用于注解在方法上
     */
    @ApiModelProperty("数据权限对应的功能名称，用于注解在方法上")
    @Column(name = "data_function_name", columnDefinition = "varchar(255) comment '数据权限对应的功能名称，用于注解在方法上'")
    @NotBlank(message = "数据权限对应的功能名称，用于注解在方法上")
    @Length(max = 255, message = "数据权限对应的mapper方法全路径长度最长为：255")
    private String dataFunctionName;

    /**
     * 数据权限需要排除的字段
     */
    @ApiModelProperty("数据权限需要排除的字段")
    @Column(name = "data_column_exclude", columnDefinition = "text comment '数据权限需要排除的字段'")
    private String dataColumnExclude;

    /**
     * 数据权限需要保留的字段
     */
    @ApiModelProperty("数据权限需要保留的字段")
    @Column(name = "data_column_include", columnDefinition = "text comment '数据权限需要保留的字段'")
    private String dataColumnInclude;

    /**
     * 自定义数据权限（增加 where条件）
     */
    @ApiModelProperty("自定义数据权限（增加 where条件）")
    @Column(name = "custom_expression", columnDefinition = "varchar(255) comment '自定义数据权限（增加 where条件）'")
    private String customExpression;

    /**
     * 组织 id 集合，逗号分割
     */
    @ApiModelProperty("组织 id 集合")
    @Column(name = "org_ids", columnDefinition = "text comment '组织 id 集合，逗号分割'")
    private String orgIds;

    /**
     * 组织id
     */
    @ApiModelProperty("组织id")
    @Column(name = "org_id", columnDefinition = "varchar(255) comment '组织id'")
    private Long orgId;

    /**
     * 状态：0禁用，1 启用
     */
    @ApiModelProperty("状态 0禁用，1 启用")
    @Column(name = "status", columnDefinition = "tinyint comment '状态： 0禁用，1 启用'")
    private Integer status;

    /**
     * 逻辑删除
     * TableField => select:false (在查询的时候排除该字段)
     */
    @TableLogic
    @TableField(value = "is_deleted", fill = FieldFill.INSERT, select = false)
    @ApiModelProperty(value = "逻辑删除", example = "0")
    @Column(name = "is_deleted", columnDefinition = "datetime comment '删除标记=> 不为null：已删除，为空：未删除'")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime deleted;

    /**
     * 数据隔离权限类型:
     * 0   本人创建的数据
     * 1   只能查看本人（根据用户id查询）
     * 2   可以查看所有数据
     * 3   本人所在组织机构
     * 4   自定义组织机构
     * 5   自定义sql过滤
     */
    @Column(name = "filter_type", columnDefinition = "tinyint comment '数据隔离权限类型'")
    @ApiModelProperty("数据权限")
    private Integer filterType;
}
